prepare("SELECT session_id FROM results WHERE id = ?"); $stmt->execute([$delete_id]); $result = $stmt->fetch(PDO::FETCH_ASSOC); if ($result) { // Delete student answers $stmt = $pdo->prepare("DELETE FROM student_answers WHERE session_id = ?"); $stmt->execute([$result['session_id']]); // Delete result $stmt = $pdo->prepare("DELETE FROM results WHERE id = ?"); $stmt->execute([$delete_id]); // Update exam session $stmt = $pdo->prepare("UPDATE exam_sessions SET status = 'abandoned' WHERE id = ?"); $stmt->execute([$result['session_id']]); $success = "Result deleted successfully!"; } } catch (PDOException $e) { $error = "Error deleting result: " . $e->getMessage(); } } // Handle bulk actions if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['bulk_action'])) { $bulk_action = sanitize_input($_POST['bulk_action']); $selected_results = $_POST['selected_results'] ?? []; if (empty($selected_results)) { $error = "Please select at least one result to perform bulk action."; } else { try { $placeholders = str_repeat('?,', count($selected_results) - 1) . '?'; if ($bulk_action === 'delete') { // Get session IDs for selected results $stmt = $pdo->prepare("SELECT session_id FROM results WHERE id IN ($placeholders)"); $stmt->execute($selected_results); $sessions = $stmt->fetchAll(PDO::FETCH_COLUMN); if ($sessions) { // Delete student answers $session_placeholders = str_repeat('?,', count($sessions) - 1) . '?'; $stmt = $pdo->prepare("DELETE FROM student_answers WHERE session_id IN ($session_placeholders)"); $stmt->execute($sessions); // Delete results $stmt = $pdo->prepare("DELETE FROM results WHERE id IN ($placeholders)"); $stmt->execute($selected_results); // Update exam sessions $stmt = $pdo->prepare("UPDATE exam_sessions SET status = 'abandoned' WHERE id IN ($session_placeholders)"); $stmt->execute($sessions); $success = count($selected_results) . " result(s) deleted successfully!"; } } elseif ($bulk_action === 'export') { // Export functionality would go here $success = "Export functionality for " . count($selected_results) . " result(s) would be implemented here."; } } catch (PDOException $e) { $error = "Error performing bulk action: " . $e->getMessage(); } } } // Get filter parameters $exam_id = $_GET['exam_id'] ?? ''; $student_id = $_GET['student_id'] ?? ''; $date_from = $_GET['date_from'] ?? ''; $date_to = $_GET['date_to'] ?? ''; $min_score = $_GET['min_score'] ?? ''; $max_score = $_GET['max_score'] ?? ''; // Build query for results with filters $query = " SELECT r.*, es.student_id, es.exam_id, es.start_time, es.end_time, s.reg_number, s.full_name as student_name, e.name as exam_name, e.year as exam_year FROM results r JOIN exam_sessions es ON r.session_id = es.id JOIN students s ON es.student_id = s.id JOIN exams e ON es.exam_id = e.id WHERE 1=1 "; $params = []; // Apply filters if ($exam_id) { $query .= " AND es.exam_id = ?"; $params[] = $exam_id; } if ($student_id) { $query .= " AND es.student_id = ?"; $params[] = $student_id; } if ($date_from) { $query .= " AND DATE(r.submitted_at) >= ?"; $params[] = $date_from; } if ($date_to) { $query .= " AND DATE(r.submitted_at) <= ?"; $params[] = $date_to; } if ($min_score) { $query .= " AND r.percentage >= ?"; $params[] = $min_score; } if ($max_score) { $query .= " AND r.percentage <= ?"; $params[] = $max_score; } // Add sorting $sort = $_GET['sort'] ?? 'submitted_at'; $order = $_GET['order'] ?? 'desc'; $allowed_sorts = ['submitted_at', 'percentage', 'correct_answers', 'student_name', 'exam_name']; $allowed_orders = ['asc', 'desc']; $sort = in_array($sort, $allowed_sorts) ? $sort : 'submitted_at'; $order = in_array($order, $allowed_orders) ? $order : 'desc'; $query .= " ORDER BY $sort $order"; $stmt = $pdo->prepare($query); $stmt->execute($params); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); // Get exams for filter dropdown $stmt = $pdo->prepare("SELECT id, name, year FROM exams ORDER BY year DESC, name"); $stmt->execute(); $exams = $stmt->fetchAll(PDO::FETCH_ASSOC); // Get students for filter dropdown $stmt = $pdo->prepare("SELECT id, reg_number, full_name FROM students ORDER BY full_name"); $stmt->execute(); $students = $stmt->fetchAll(PDO::FETCH_ASSOC); // Calculate statistics $total_results = count($results); $average_score = $total_results > 0 ? array_sum(array_column($results, 'percentage')) / $total_results : 0; $highest_score = $total_results > 0 ? max(array_column($results, 'percentage')) : 0; $lowest_score = $total_results > 0 ? min(array_column($results, 'percentage')) : 0; // Score distribution $score_ranges = [ '90-100' => 0, '80-89' => 0, '70-79' => 0, '60-69' => 0, '50-59' => 0, '0-49' => 0 ]; foreach ($results as $result) { $score = $result['percentage']; if ($score >= 90) $score_ranges['90-100']++; elseif ($score >= 80) $score_ranges['80-89']++; elseif ($score >= 70) $score_ranges['70-79']++; elseif ($score >= 60) $score_ranges['60-69']++; elseif ($score >= 50) $score_ranges['50-59']++; else $score_ranges['0-49']++; } ?> View Results - Admin

Exam Results Analysis

Comprehensive overview of student performance and exam results

Total Results

Exam attempts completed

%

Average Score

Across all attempts

%

Highest Score

Best performance

%

Lowest Score

Worst performance

Score Distribution

Performance Overview

Filter Results

❌ Clear Filters
Showing result(s) (filtered)

Exam Results

0): ?>
= 80) { $score_class = 'score-excellent'; $performance_badge = 'badge-excellent'; $performance_text = 'Excellent'; } elseif ($result['percentage'] >= 60) { $score_class = 'score-good'; $performance_badge = 'badge-good'; $performance_text = 'Good'; } elseif ($result['percentage'] >= 40) { $score_class = 'score-average'; $performance_badge = 'badge-average'; $performance_text = 'Average'; } else { $score_class = 'score-poor'; $performance_badge = 'badge-poor'; $performance_text = 'Poor'; } $start_time = new DateTime($result['start_time']); $end_time = new DateTime($result['end_time']); $duration = $start_time->diff($end_time); $duration_display = $duration->h > 0 ? sprintf('%dh %dm', $duration->h, $duration->i) : sprintf('%dm %ds', $duration->i, $duration->s); ?>
Student Exam Score Percentage Performance Submitted Duration Actions

/
attempted
%
📊

No Results Found

View All Results